class Reserva < ActiveRecord::Base
	belongs_to :archivo
	belongs_to :proveedor
	has_and_belongs_to_many :reserva_sps, :join_table => "reservas_sp_reservas", :order =>"fecha"
	has_many :seguimientos_reserva, :class_name => "SeguimientoReserva", :dependent=>:destroy
	has_many :seguimientos_caja, :class_name => "SeguimientoCaja", :dependent=>:destroy
	has_many :programaciones_pago, :class_name => "ProgramacionPago", :dependent=>:destroy
	has_many :comprobante_pago
	
	def self.reservas_sin_comprobante(reserva_id)
		find_by_sql(["select 
					r.id, 
					a.codigo as archivo_codigo, 
					p.id as proveedor_id, 
					p.nombre as proveedor_nombre, 
					p.ruc as proveedor_ruc, 
					cp.id as comprobante_id
				from 
					reservas r
					JOIN proveedores p ON r.proveedor_id=p.id
					JOIN archivos a ON r.archivo_id=a.id
					LEFT JOIN comprobantes_pago cp ON cp.reserva_id = r.id
				where
					cp.id is null or r.id = '#{reserva_id}'
				order by r.id"])
	end
	
	def para_comprobante
		(proveedor ? "#{id}: (#{proveedor.ruc}) #{proveedor}" : "**#{id}: PROVEEDOR ELIMINADO!**")
	end
	
	def fecha_generacion
		seguimientos_reserva.select { |seg| seg.estado_reserva_id == 1 }.first.fecha
	end
	
	def generar
		seguimientos_reserva << SeguimientoReserva.new(:fecha=>Date.today, :estado_reserva_id => 1)
		seguimientos_caja << SeguimientoCaja.new(:fecha=>Date.today, :estado_caja_id => 1)
		programaciones_pago << ProgramacionPago.new(
				:fecha_max=> archivo.fecha_pago, #fecha_termino, #  fecha_minima, 
				:porcentaje => 100, 
				:moneda => moneda, 
				:monto => total)
	end	
	
	def to_s
		id.to_s
	end
	
	def agregar_sp(reserva_sp)		
		self.fecha_min ||= reserva_sp.fecha
		self.fecha_max ||= reserva_sp.fecha
		self.fecha_min = reserva_sp.fecha if reserva_sp.fecha < self.fecha_min
		self.fecha_max = reserva_sp.fecha if reserva_sp.fecha > self.fecha_max
		reserva_sps << reserva_sp
	end
	
	def anulada?		
		seguimientos_reserva.inject(false) { |anulada, seg| anulada = anulada or seg.estado_reserva_id==5}
	end
	
	def confirmada?		
		seguimientos_reserva.inject(false) { |confirmada, seg| confirmada = confirmada or seg.estado_reserva_id==4}
	end
	
	def con_adelanto?		
		comprobante_pago.size > 0 #seguimientos_caja.inject(false) { |adelanto, seg| adelanto = adelanto or seg.estado_caja_id==4}
	end
	
	def saldo_programacion
		total-total_programacion
	end
	
	def total_programacion
		programaciones_pago.inject(0) { |t, programacion| t+=programacion.monto }
	end
	
	def total		
		reserva_sps.inject(0){ |t, sp| 
			t+=sp.costo
		}			
	end
	
	def moneda
		reserva_sps[0].moneda
	end
	
	def detalle_orden_servicio
		ArchivoSp.find_by_sql(["select 
						sg.fecha as FECHA, 
						s.nombre as SERVICIO,						
						sg.cantidad as CANT,
						sg.nro_paxs as PAXs,
						precio_extranjero as PU,
						case
							when total_manual is null then precio_extranjero*sg.cantidad 
							else total_manual 
						end as IMPORTE,
						m.nombre as MONEDA,
						sg.observacion as OBSERVACION
					from 
						reserva_sps sg join reservas_sp_reservas re
							on (sg.id = re.reserva_sp_id)
						join servicios s
							on (sg.servicio_id=s.id)
						join monedas m
							on (sg.moneda_id=m.id)							
					where 
						re.reserva_id=#{id}
					order by sg.fecha"])
	end	
	
	def fecha_minima
		min = nil
		for sp in reserva_sps
			min||=sp.fecha
			min = sp.fecha if sp.fecha < min
		end
		min
	end	
	
	#Reportes PDF
	def to_pdf(tipo=nil)
		if reserva_sps.size <= 12
			pdf = PDF::Writer.new(:paper=>[14, 22.5], :orientation => :landscape)	
		else
			pdf = PDF::Writer.new()	
		end
		pdf.select_font "Times-Roman"		
		pdf.margins_cm(0.5)
		
		render_cabecera(pdf, tipo)		
		render_servicios(pdf, tipo)		
		render_promo(pdf) if promo && (proveedor.tipo_servicio_id == 2 || proveedor.tipo_servicio_id == 3)
		render_nota(pdf) if tipo == "voucher" && proveedor.tipo_servicio_id == 2
		render_cuentas_y_contactos(pdf)	if tipo == "orden"
		render_firmas(pdf,tipo)				
		pdf.render
	end
	
	#private
	def render_cabecera(pdf, tipo)
		if tipo=="voucher"
			pdf.add_text_wrap(pdf.absolute_left_margin + 40, pdf.absolute_top_margin - 25, 150, "TRANS TREKPERU E.I.R.L.")
			#pdf.add_image_from_file('\iReserver2\public\images\logo.png',pdf.absolute_left_margin, pdf.absolute_top_margin-40, 40,40) if tipo=="voucher"			
			s = "VOUCHER NRO : #{id}"			
			s+= " <<ANULADO>>" if anulada?
			pdf.text s, :font_size => 14, :justification => :center 
			pdf.text "Grupo : #{archivo}", :font_size => 10, :justification => :center			
			pdf.text "Guia/TC : #{archivo.tc}", :font_size => 10, :justification => :center			
					
			pdf.text "Sr(es) : #{proveedor}", :spacing=>2, :justification => :center					
			pdf.text	"-"*180
		else
			pdf.add_text_wrap(pdf.absolute_left_margin, pdf.absolute_top_margin - 10, 150, "TRANS TREKPERU E.I.R.L.")			
			s = "ORDEN DE SERVICIO : #{id}"		
			s+= " <<ANULADO>>" if anulada?
			pdf.text s, :font_size => 14
			pdf.text "Grupo : #{archivo}", :font_size => 10
			pdf.text "Guia/TC : #{archivo.tc}", :font_size => 10
			pdf.text "Nro Pax : #{archivo.nro_personas}", :font_size => 10
					
			pdf.text "Sr(es) : #{proveedor}", :spacing=>2
			pdf.text "Razon Social : #{proveedor.razon_social}"
			pdf.text	"-"*175
		end		
	end
	
	def render_servicios(pdf,tipo)
		tabla = PDF::SimpleTable.new
		tabla.heading_font_size = 10
		tabla.font_size = 9
		tabla.show_lines = :none
		tabla.shade_rows = :none
		tabla.position = :left
		tabla.orientation = :right
		tabla.width = 600
		if tipo=="orden"
			tabla.column_order = ['FECHA', 'SERVICIO', 'CANT', 'PAXs', 'PU', 'IMPORTE', 'MONEDA', 'OBSERVACION']
		elsif tipo=="voucher"
			tabla.column_order = ['FECHA', 'SERVICIO', 'CANT', 'OBSERVACION']
		end
		tabla.columns["FECHA"] = PDF::SimpleTable::Column.new("FECHA") { |col|			
			col.width = 55
		}
		tabla.columns["SERVICIO"] = PDF::SimpleTable::Column.new("SERVICIO") { |col|			
			col.width = 180
		}
		tabla.columns["CANT"] = PDF::SimpleTable::Column.new("CANT") { |col|			
			col.width = 40
			col.justification = :right
		}		
		if tipo == "orden"
			tabla.columns["PAXs"] = PDF::SimpleTable::Column.new("PAXs") { |col|			
				col.width = 40
				col.justification = :right
			}
			tabla.columns["PU"] = PDF::SimpleTable::Column.new("PU") { |col|			
				col.width = 40
				col.justification = :right
			}
			tabla.columns["IMPORTE"] = PDF::SimpleTable::Column.new("IMPORTE") { |col|			
				col.width = 60
				col.justification = :right
			}
			tabla.columns["MONEDA"] = PDF::SimpleTable::Column.new("MONEDA") { |col|			
				col.width = 90
			}			
		end
		tabla.columns["OBSERVACION"] = PDF::SimpleTable::Column.new("OBSERVACION") { |col| }
		tabla.data = detalle_orden_servicio
		tabla.render_on(pdf)		
		pdf.text	"-"*175
		pdf.text "TOTAL : #{moneda.simbolo}#{total.to_s}" if tipo == "orden"
	end
	
	def render_firmas(pdf, tipo)
		y = 30
		w = 100
		
		pdf.add_text_wrap(pdf.left_margin+100, y + 10, w, "---------------------------")
		pdf.add_text_wrap(pdf.left_margin+100, y, w, "V.B. Jefe de Reservas")		
		pdf.add_text_wrap(pdf.left_margin+100, y - 10, w, "(Lizlea Nunez Guillen)")		
		
		pdf.add_text_wrap(pdf.absolute_x_middle+100, y + 10, w, "---------------------")
		pdf.add_text_wrap(pdf.absolute_x_middle+100, y, w, "V.B. Proveedor")		
	end
	
	def render_cuentas_y_contactos(pdf)
		fh = 8
		w = 200
		x = pdf.absolute_right_margin - w
		y = pdf.absolute_top_margin
		
		pdf.add_text_wrap(x, y, w, "Generado : #{fecha_generacion}", fh, :left)		
		pdf.add_text_wrap(x, y - 10, w, "CUENTAS DE DEPOSITO:", fh, :left)
    @cuentas=proveedor.cuentas.join(',').split(',')
    pos=10;
    @cuentas.each { |cuenta|
    		pdf.add_text_wrap(x, y - pos+=10, w, cuenta, fh, :left)
        }
		
		#pdf.add_text_wrap(x, y - 30, w, "CONTACTOS", fh, :right)		
		#pdf.add_text_wrap(x, y - 40, w, proveedor.contactos_reserva.join(' - '), fh, :right)	
		
		#pdf.add_text_wrap(x, y - 50, w, proveedor.cuentas[0], fh, :right)
		#pdf.add_text_wrap(x, y - 60, w, proveedor.cuentas[1], fh, :right)
		
	end
	
	def render_nota(pdf)
		pdf.text ''
		pdf.text "EXPORTACION DE SERVICIOS D.L.919", :font_size => 8, :justification=>:right
		pdf.text "Servicios de Alojamiento y Alimentacion utilizadas por personas", :justification=>:right
		pdf.text "NO DOMICILIADAS que estan afectos al IGV (Impuesto General ", :justification=>:right
		pdf.text "a las Ventas) de acuerdo a lo establecido en el D.S.122-2, 0001-EF", :justification=>:right
		pdf.text '', :font_size => 10
	end		
	
	def render_promo(pdf)
		pdf.text ''
		pdf.text promo, :font_size => 8
		pdf.text '', :font_size => 10
	end
end
